package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.dto.DishDTO;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.ShoppingCartService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @ClassName ShoppingCartServiceImpl
 * @Description 购物车业务层实现类
 * @Author sld
 * @Date 2024/7/12 10:00
 * Version 1.0
 **/
@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Resource
    private ShoppingCartMapper shoppingCartMapper; // 购物车持久层
    @Resource
    private DishMapper dishMapper;  // 菜品持久层
    @Resource
    private SetmealMapper setmealMapper;    // 套餐持久层

    @Override
    // @Transactional    虽然有多次数据库操作，但最终执行增删改的只会有一次，所以不需要事务
    public void add(ShoppingCartDTO shoppingCartDTO) {
        ShoppingCart shoppingCart = new ShoppingCart(); // 封装购物车实体类
        BeanUtils.copyProperties(shoppingCartDTO, shoppingCart); // 复制对象
        shoppingCart.setUserId(BaseContext.getCurrentId()); // 设置当前用户 // 用户id不能从前端获取
        /*  查询购物车中是否存在该商品，只查询当前用户的  */
        List<ShoppingCart> list  = shoppingCartMapper.list(shoppingCart);
        if(list != null && list.size() > 0){    // 购物车中有该商品 // 存在商品，则修改数量+1
            ShoppingCart cart = list.get(0); // 获取商品
            cart.setNumber(cart.getNumber() + 1); // 修改数量
            shoppingCartMapper.updateNumberById(cart); // 更新购物车数量
        }else {     // 不存在则添加商品到购物车
            if(shoppingCartDTO.getDishId() != null){ // 判断是不是菜品   // 是菜品
                // 从菜品表中获取数据填充到购物车实体类中
                DishDTO dishDTO = dishMapper.getById(shoppingCartDTO.getDishId()); // 查询菜品表
                shoppingCart.setName(dishDTO.getName());    // 菜品名称
                shoppingCart.setImage(dishDTO.getImage());   // 图片地址
                shoppingCart.setAmount(dishDTO.getPrice());     // 菜品单价
            }else { // 不是菜品--套餐
                // 从套餐表中获取数据填充到购物车实体类中
                Setmeal setmeal = setmealMapper.getById(shoppingCart.getSetmealId());  // 查询套餐表中的数据
                shoppingCart.setName(setmeal.getName());    // 套餐名称
                shoppingCart.setImage(setmeal.getImage());  // 套餐图片
                shoppingCart.setAmount(setmeal.getPrice());     // 套餐价格
            }
            shoppingCart.setNumber(1);  // 设置新增的购物车，数量为1
            shoppingCart.setCreateTime(LocalDateTime.now());  // 设置新增的购物车，创建时间为当前时间
            shoppingCartMapper.insert(shoppingCart);    //  新增购物车
        }
    }

    // 查询购物车
    @Override
    public List<ShoppingCart> list() {
        // 实体类对象
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.setUserId(BaseContext.getCurrentId()); // 设置用户id
        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
        return list;
    }

    /**
     * 清空购物车
     */
    @Override
    public void clean() {
        // 实体类对象
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.setUserId(BaseContext.getCurrentId()); // 用户id
        // 执行删除
        shoppingCartMapper.delete(shoppingCart);
    }

    /**
     * 删除购物车中的商品：数量大于一则数量-1，数量小于1则删除
     * @param shoppingCartDTO
     */
    @Override
    public void sub(ShoppingCartDTO shoppingCartDTO) {
        // 封装实体类
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);    // 复制对象
        shoppingCart.setUserId(BaseContext.getCurrentId());     // 设置用户id
        // 查询购物车
        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
        if(list != null && list.size() > 0){    // 有没有查到数据
            // 获取查到的数据： 用户id+菜品id（套餐id），结果只会有一条
            ShoppingCart cart = list.get(0);
            // 判断数量是否大于一
            if(cart.getNumber()>1){ // 如果大于一，则数量减一
                cart.setNumber(cart.getNumber()-1); // 设置数量减一
                shoppingCartMapper.updateNumberById(cart); // 修改商品
            }else {  // 如果等于或小于一，则删除该商品
                shoppingCartMapper.delete(cart);
            }
        }
    }
}
